package com.ithuang.quartz.task;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * ok  统计数量
 */
public class Task5 {
    
    public static void main(String[] args) {
        // 指定要遍历的根目录
        String folderPath = "C:\\Users\\Administrator\\Documents\\jjjj - 副本";
        File rootFolder = new File(folderPath);

        // 输出树形结构
        System.out.println("树形结构：");
        printNcFileTree(rootFolder, "", true);
    }

    /**
     * 递归遍历目录，输出树形结构并统计相似 .nc 文件的数量
     *
     * @param folder  当前文件夹
     * @param prefix  前缀（用于缩进和连接符号）
     * @param isLast  是否是父文件夹的最后一个子项
     */
    public static void printNcFileTree(File folder, String prefix, boolean isLast) {
        // 打印当前文件夹的名称
        System.out.println(prefix + (isLast ? "└── " : "├── ") + folder.getName());

        if (folder.isDirectory()) {
            // 获取文件夹下的所有文件和文件夹
            File[] files = folder.listFiles();
            if (files != null) {
                // 用于统计当前文件夹中的 .nc 文件
                Map<String, Integer> similarityMap = new HashMap<>();

                // 遍历文件和子文件夹
                for (int i = 0; i < files.length; i++) {
                    boolean isLastChild = (i == files.length - 1);
                    if (files[i].isDirectory()) {
                        // 如果是文件夹，递归遍历
                        printNcFileTree(files[i], prefix + (isLast ? "    " : "│   "), isLastChild);
                    } else if (files[i].isFile() && files[i].getName().endsWith(".nc")) {
                        // 如果是 .nc 文件，提取相似规则并统计
                        String similarityKey = extractSimilarityKey(files[i].getName());
                        similarityMap.put(similarityKey, similarityMap.getOrDefault(similarityKey, 0) + 1);
                    }
                }

                // 输出当前文件夹中的 .nc 文件统计结果
                for (Map.Entry<String, Integer> entry : similarityMap.entrySet()) {
                    System.out.println(prefix + (isLast ? "    " : "│   ") + (isLast ? "└── " : "├── ") + entry.getKey() + "  ->  " + entry.getValue());
                }
            }
        }
    }

    /**
     * 提取文件名中的相似规则（去掉前面的数字部分）
     *
     * @param fileName 文件名
     * @return 相似规则
     */
    public static String extractSimilarityKey(String fileName) {
        // 找到第一个非数字字符的位置
        int index = 0;
        while (index < fileName.length() && Character.isDigit(fileName.charAt(index))) {
            index++;
        }
        // 返回去掉前面数字部分后的字符串
        return fileName.substring(index);
    }
}
